Відображення записів
====================

У нашому додатку запис може відображатися як окремо, так і серед інших
записів. Перше реалізується дією `view`, друге - `index`. У даному розділі
ми змінимо обидві дії для досягнення первинних вимог.

Зміна дії `view`
----------------

Дія `view` реалізована у методі `actionView()` контролера `PostController`.
HTML, що віддається користувачеві, генерується із відображення `view`, який знаходиться
у файлі `/wwwroot/blog/protected/views/post/view.php`.

Нижче приведений код дії `view` контролера `PostController`:

~~~
[php]
public function actionView()
{
    $post=$this->loadModel();
    $this->render('view',array(
        'model'=>$post,
    ));
}

private $_model;

public function loadModel()
{
	if($this->_model===null)
	{
		if(isset($_GET['id']))
		{
			if(Yii::app()->user->isGuest)
				$condition='status='.Post::STATUS_PUBLISHED
					.' OR status='.Post::STATUS_ARCHIVED;
			else
				$condition='';
			$this->_model=Post::model()->findByPk($_GET['id'], $condition);
		}
		if($this->_model===null)
			throw new CHttpException(404,'Запитувана сторінка не існує.');
	}
	return $this->_model;
}
~~~

Наші зміни в основному торкнулися методу `loadModel()`. 
У ньому ми отримуємо запис із таблиці `Post`, використовуючи параметр `id` із GET. 
Якщо запис не знайдено, не опублікована або знаходиться у архіві, 
і при цьому користувач є гостем - відображаємо помилку 404. 
Інакше повертаємо обʼєкт запису методу `actionView()`, який передає обʼєкт відображенню.

> Tip|Підказка: Yii перехоплює виключення HTTP (екземпляри класу [CHttpException]) 
і відображає їх, використовуючи або зумовлені, або власні шаблони. 
Каркас, згенерований `yiic` вже містить свій шаблон для помилок у файлі 
`/wwwroot/blog/protected/views/site/error.php`. 
При необхідності ми можемо змінити цей файл.

Зміни у відображенні `view` в основному торкаються форматування та стилю
відображення запису, тому на ньому ми зупинятися не будемо.
Зацікавлені читачі можуть звернутися до файла
`/wwwroot/blog/protected/views/post/view.php`.

Зміна дії `index`
-----------------

Як і в дії `view`, ми будемо змінювати дію `index` у двох місцях:
метод `actionIndex()` контролера `PostController` і відображення
`/wwwroot/blog/protected/views/post/index.php`. 
Потрібно додати підтримку відображення записів з певним тегом.

Нижче наведено змінений метод `actionIndex()` контролера `PostController`:

~~~
[php]
public function actionIndex()
{
	$criteria=new CDbCriteria(array(
		'condition'=>'status='.Post::STATUS_PUBLISHED,
		'order'=>'update_time DESC',
		'with'=>'commentCount',
	));
	if(isset($_GET['tag']))
		$criteria->addSearchCondition('tags',$_GET['tag']);

	$dataProvider=new CActiveDataProvider('Post', array(
		'pagination'=>array(
			'pageSize'=>5,
		),
		'criteria'=>$criteria,
	));

	$this->render('index',array(
		'dataProvider'=>$dataProvider,
	));
}
~~~

Спочатку ми створюємо критерій запиту для отримання списку записів. 
Критерій включає обмеження на одержання тільки опублікованих записів і сортування
по часу їх оновлення у зворотному порядку. Так як при відображенні запису
в списку ми також хочемо показувати кількість коментарів, у критерії вказується
необхідність одержання звʼязку `commentCount`, описаного у `Post::relations()`.

У тому випадку, коли користувач хоче отримати записи з певним тегом,
ми додаємо у критерій умову пошуку тега.

Використовуючи критерій ми створюємо провайдер даних, потрібний для трьох цілей. 
По-перше, він займається розбивкою даних на сторінки. 
Ми задаємо кількість результатів на сторінку рівним 5. 
По-друге, дані сортуються відповідно до запиту користувача. 
І, нарешті, провайдер віддає розбиті на сторінки 
відсортовані дані віджетам або відображенню.

Після того, як ми закінчили із `actionIndex()`, ми змінюємо відображення `index`
як показано нижче. Будемо відображати заголовок `h1` у тому випадку, коли користувач
буде запитувати записи із певним тегом.

~~~
[php]
<?php if(!empty($_GET['tag'])): ?>
<h1>Записи із тегом <i><?php echo CHtml::encode($_GET['tag']); ?></i></h1>
<?php endif; ?>

<?php $this->widget('zii.widgets.CListView', array(
	'dataProvider'=>$dataProvider,
	'itemView'=>'_view',
	'template'=>"{items}\n{pager}",
)); ?>
~~~

Варто відзначити, що для побудови списку записів ми використовуємо [CListView].
Цей віджет використовує відображення для побудови кожного окремого запису.
Ми вказуємо відображення `_view`, тобто файл
`/wwwroot/blog/protected/views/post/_view.php`, у якому ми можемо
звертатися до запису через змінну `$data`.
